package com.iweb.blog.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class JedisUtils {

    // Jedis 连接池对象
    private static JedisPool jedisPool;

    // 初始化连接池的静态代码块
    static {
        try {
            // 加载配置文件
            Properties properties = new Properties();
            InputStream inputStream = JedisUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
            if (inputStream == null) {
                throw new RuntimeException("找不到 jedis.properties 文件！");
            }
            properties.load(inputStream);

            // 获取配置项
            String host = properties.getProperty("host", "127.0.0.1"); // 默认值 127.0.0.1
            int port = Integer.parseInt(properties.getProperty("port", "6379")); // 默认值 6379
            int timeout = Integer.parseInt(properties.getProperty("timeout", "2000")); // 默认值 2000 ms
            int maxTotal = Integer.parseInt(properties.getProperty("jedis.pool.max-active", "20")); // 最大连接数
            int maxIdle = Integer.parseInt(properties.getProperty("jedis.pool.max-idle", "10")); // 最大空闲连接数
            int minIdle = Integer.parseInt(properties.getProperty("jedis.pool.min-idle", "2")); // 最小空闲连接数
            long maxWaitMillis = Long.parseLong(properties.getProperty("maxWaitMillis", "3000")); // 最大等待时间

            // 配置 Jedis 连接池
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(maxTotal);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);

            // 初始化 JedisPool
            jedisPool = new JedisPool(poolConfig, host, port, timeout);

        } catch (IOException e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError("初始化 JedisPool 失败：" + e.getMessage());
        }
    }

    /**
     * 获取 Jedis 连接
     *
     * @return Jedis 实例
     */
    public static Jedis getJedis() {
        if (jedisPool != null) {
            return jedisPool.getResource();
        }
        throw new IllegalStateException("JedisPool 未被初始化！");
    }

    /**
     * 释放 Jedis 资源
     *
     * @param jedis Jedis 实例
     */
    public static void closeJedis(Jedis jedis) {
        if (jedis != null) {
            jedis.close(); // JedisPool 会自动回收连接
        }
    }

    /**
     * 设置键值对
     *
     * @param key   键
     * @param value 值
     */
    public static void set(String key, String value) {
        try (Jedis jedis = getJedis()) {
            jedis.set(key, value);
        }
    }

    /**
     * 获取键对应的值
     *
     * @param key 键
     * @return 值
     */
    public static String get(String key) {
        try (Jedis jedis = getJedis()) {
            return jedis.get(key);
        }
    }

    /**
     * 删除键
     *
     * @param key 键
     */
    public static void del(String key) {
        try (Jedis jedis = getJedis()) {
            jedis.del(key);
        }
    }

    /**
     * 判断键是否存在
     *
     * @param key 键
     * @return 是否存在
     */
    public static boolean exists(String key) {
        try (Jedis jedis = getJedis()) {
            return jedis.exists(key);
        }
    }

    /**
     * 设置带过期时间的键值对
     *
     * @param key     键
     * @param value   值
     * @param seconds 过期时间（秒）
     */
    public static void setex(String key, String value, int seconds) {
        try (Jedis jedis = getJedis()) {
            jedis.setex(key, seconds, value);
        }
    }

    /**
     * 获取连接池实例（如果外部需要操作池）
     *
     * @return JedisPool 实例
     */
    public static JedisPool getJedisPool() {
        return jedisPool;
    }
}
